package com.hospitalsystem.dao;

import com.hospitalsystem.entity.Doctor;
import com.hospitalsystem.entity.Drug;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * (Doctor)表数据库访问层
 *
 * @author makejava
 * @since 2024-12-28 19:32:19
 */
public interface DoctorDao {

    /**
     * 通过ID查询单条数据
     *
     * @param  dId
     * @return 实例对象
     */
    Doctor queryById(String dId);



    List<Doctor> queryAll(@Param("offset") int offset, @Param("pageSize") int pageSize);

    /**
     * 统计总行数
     *
     *
     * @return 总行数
     */
    long count();

    /**
     * 新增数据
     *
     * @param doctor 实例对象
     * @return 影响行数
     */
    int insert(Doctor doctor);

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     *
     * @param entities List<Doctor> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<Doctor> entities);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param entities List<Doctor> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<Doctor> entities);

    /**
     * 修改数据
     *
     * @param doctor 实例对象
     * @return 影响行数
     */
    int update(Doctor doctor);

    /**
     * 通过主键删除数据
     *
     * @param  dId
     * @return 影响行数
     */
    int deleteById(String dId);

    String login(String dId,String password);

    Boolean existIdAndPassword(String dId,String password);

    /**
     * 查询某个医生在特定时间段的剩余名额
     *
     * @param dId      医生ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 剩余名额
     */
    Integer findAvailableSlots(@Param("dId") String dId,
                               @Param("startTime") String startTime,
                               @Param("endTime") String endTime);


    /**
     * 查询所有有剩余名额的医生
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 医生列表
     */
    List<Doctor> findDoctorsWithAvailableSlots(@Param("startTime") String startTime,
                                               @Param("endTime") String endTime);

    List<Doctor> findAll();

    String getNameByDId(String dId);

    List<Doctor> getDoctorsByDepartment(String department);

    List<Doctor> getDoctorsWithAvailableSlotsByDepartment(@Param("startTime") String startTime,
                                                          @Param("endTime") String endTime, String department);
    Boolean updateIfTake1(String mId);

    Boolean updateIfTake_1(String mId);

    Boolean updateIfPay(String mId);

    Boolean updateDrugStockBatch(Drug drug);

    String getDrugListByMId(String mId);
}

